// 统计句子或者段落中单词数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/// @brief 获取一句话中单词个数，重复的也算在内
/// @param str 表示一句话
/// @return 单词个数
int getWordNum(char str[])
{
	// state表示遍历句子时指针i是否在单词中，1表示是0表示否
	int num = 0, state = 1, i, length = strlen(str);
	for (i = 0; i < length; i++)
	{
		// 若上一个字符不是空格且当前为空格，则单词数加一
		if (state == 1 && str[i] == ' ')
		{
			num++;
			state = 0;
			continue;
		}
		// 若当前为单词且上一个为空格，则使state置为1
		if (state == 0 && str[i] != ' ')
		{
			state = 1;
		}
		// 否则说明当前为空格且上一个字符也是空格，则无操作
	}
	return num + 1;
}

/// @brief 判断一个单词数组中某个单词是否存在
/// @param words 存放单词的数组
/// @param wordNum 单词列表中单词数量
/// @param target 待判断的单词
/// @return 是否存在
int isWordExists(char words[][100], int wordNum, char target[])
{
	int i;
	for (i = 0; i < wordNum; i++)
	{
		if (strcmp(target, words[i]) == 0)
		{
			return 1;
		}
	}
	return 0;
}

/// @brief 获取一句话中单词个数，重复的不算
/// @param str 表示一句话
/// @return 单词个数
int getWordNumNoRepeat(char str[])
{
	// words记录已经读取的单词
	// current表示当前正在读取的单词
	char words[1000][100], current[100];
	// state表示遍历句子时指针i是否在单词中，1表示是0表示否
	// j表示当前正在读取的单词的字母下标
	int num = 0, state = 1, i, j = 0, length = strlen(str);
	// 考虑到最后一个单词
	for (i = 0; i <= length; i++)
	{
		// 若当前读取到字母
		if (str[i] != ' ' && str[i] != '\0')
		{
			// 如果是个新单词
			if (state == 0)
			{
				j = 0;
				state = 1;
			}
			// 记录单词
			current[j] = str[i];
			j++;
		}
		else
		{
			// 若读取到空格
			// 若上个字母是单词
			if (state == 1)
			{
				state = 0;
				current[j] = '\0';
				// 若这个单词不存在于单词表中则放入单词表并进行计数
				if (!isWordExists(words, num, current))
				{
					strcpy(words[num], current);
					num++;
				}
			}
		}
	}
	return num;
}

/// @brief 读取文本文件所有行，并返回文件行数
/// @param path 文件路径
/// @param result 存放结果的二维数组
/// @return 文件行数
int readAllLines(char path[], char result[][1000])
{
	// 存放每一行
	char line[1000];
	// 打开文件
	FILE *file = fopen(path, "r");
	// 读取每行并存入结果
	int lineIndex = 0;
	while (fgets(line, 1000, file) != NULL)
	{
		strcpy(result[lineIndex], line);
		lineIndex++;
	}
	fclose(file);
	return lineIndex;
}

int main()
{
	return 0;
}